﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace General
{
    /// <summary>
    /// Modelliert eine Stoppuhr.
    /// </summary>
    public static class TimeClock
    {
        #region Attribute
        private static Dictionary<string, DateTime> timers = new Dictionary<string, DateTime>();
        private static object syncLock = new object();
        #endregion Attribute

        #region Methoden
        /// <summary>
        /// Startet eine spezifische Stoppuhr
        /// </summary>
        /// <param name="name">Der Name der Stoppuhr.</param>
        public static void Start(string name)
        {
            lock (syncLock)
            {
                if (timers.ContainsKey(name)) timers[name] = DateTime.Now;
                else timers.Add(name, DateTime.Now);
            }
        }

        /// <summary>
        /// Stoppt eine spezifische Stoppuhr und gibt einen Text in die Konsole aus.
        /// </summary>
        /// <param name="name">Der Name der Stoppuhr.</param>
        public static void Stop(string name)
        {
            lock (syncLock)
            {
                DateTime End = DateTime.Now;
                if (timers.ContainsKey(name)) ConsolePrinter.WriteLine("" + name + " hat " + Math.Round((new TimeSpan(End.Ticks - timers[name].Ticks)).TotalMilliseconds / 1000, 5) + " Sekunden benötigt.");
                else ConsolePrinter.WriteLine("" + name + " wurde nie gestartet!");
            }
        }

        /// <summary>
        /// Stoppt eine spezifische Stoppuhr und gibt einen spezifischen Text in die Konsole aus.
        /// </summary>
        /// <param name="name">Der Name der Stoppuhr.</param>
        /// <param name="prefix">Der vor der Zeit auszugebende Text.</param>
        /// <param name="postfix">Der nach der Zeit auszugebende Text.</param>
        public static void Stop(string name, string prefix, string postfix)
        {
            lock (syncLock)
            {
                DateTime End = DateTime.Now;
                if (timers.ContainsKey(name)) ConsolePrinter.WriteLine(prefix + " " + Math.Round((new TimeSpan(End.Ticks - timers[name].Ticks)).TotalMilliseconds / 1000, 5) + " " + postfix);
                else ConsolePrinter.WriteLine("" + name + " wurde nie gestartet!");
            }
        }

        /// <summary>
        /// Gibt die gemessene Zeit in Sekunden zurück.
        /// </summary>
        /// <param name="name">Der Name der Stoppuhr.</param>
        /// <returns>Die gemessene Zeit.</returns>
        public static double GetTime(string name)
        {
            lock (syncLock)
            {
                DateTime End = DateTime.Now;
                if (timers.ContainsKey(name)) return (new TimeSpan(End.Ticks - timers[name].Ticks)).TotalMilliseconds / 1000;
                else throw new Exception("Die Stoppuhr '" + name + "' wurde nie gestartet.");
            }
        }
        #endregion Methoden
    }
}
